package com.gitee.cashzhang27.test.sdk.bestsign.domain.request;

import cn.hutool.http.Method;
import com.gitee.cashzhang27.test.sdk.bestsign.domain.AbstractBestSignRequest;
import com.gitee.cashzhang27.test.sdk.bestsign.domain.BestSignRequest;
import com.gitee.cashzhang27.test.sdk.bestsign.domain.response.ContractSendResponse;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

/**
 * @author Cash Zhang
 * @version v1.0
 * @since 2019/08/09 11:02
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class ContractSendRequest extends AbstractBestSignRequest implements
    BestSignRequest<ContractSendResponse> {

  /**
   * 合同编号
   */
  private String contractId;
  /**
   * 签署者账号
   */
  private String signer;
  /**
   * 有效时间
   * 签署链接的到期时间，unix时间戳格式（秒数）。
   * 超过此时间则无法打开链接页面，需要获取新的签署合同链接。
   * 格式为秒级的unix时间戳，如希望“2017/12/30 10:21:52”到期，则设置为“1514600512”。
   * 注：并不是合同的可签署到期时间，只是此签署链接的有效期。
   * 由于返回的是短链接，如果没有设置则默认是30分钟，
   * 如果设置了以设置的为准，但有效期最大不能超过7天
   */
  private String expireTime;
  /**
   * 图片清晰度
   * 预览图片清晰度，
   * 枚举值：
   * 96-低清（默认）
   * 120-普清
   * 160-高清
   * 240-超清
   * 非必填
   */
  private String dpi;
  /**
   * 是否允许拖动签名位置
   * 在有指定signaturePOSTion参数的情况下，
   * 取值1/0。（0：不允许，1：允许）
   * 默认值 允许
   * 非必填
   */
  private String isAllowChangeSignaturePosition;
  /**
   * 请求业务流水号
   * 开发者自定义的签署流水号（比如第几次签署之类），
   * 如有填写，则在异步推送签署结果时包含此签署流水号
   * 非必填
   */
  private String sid;
  /**
   * 签名/印章图片
   * 签名/印章图片。取值default或者指定的印章名称。（手动签都用默认的）
   * 默认default
   * 非必填
   */
  private String signatureImageName;
  /**
   * 是否手绘签名
   * 手动签署时是否手绘签名。取值0/1/2。
   * 0点击签名图片不会触发手写面板（禁止手写）。
   * 1点击签名图片能触发手写面板（既可手写也可使用默认签名）。
   * 2强制必须手绘签名（只能手写不允许使用默认签名），
   * 初始不显示用户签名图片，只显示实时手写的签名。
   * 默认 1
   * 非必填
   */
  private String isDrawSignatureImage;
  /**
   * 验证码手机号
   * 手动签署时指定接收手机验证码的手机号
   * 如果需要采用手动签署页面校验短信验证码，则此项必填。
   * 如果手动签不需要短信校验，则此项可不填。 自动签可不填此项。
   * 非必填
   */
  private String vcodeMobile;
  /**
   * 手动签署时，当用户签署完成后，签署页面指定回跳的页面地址，
   * 如果没填此参数则签署完成后跳转到合同预览页面。
   * <span style="color:red">如果returnurl带有“http”或“https”开头则判定h5跳转，
   * 如果returnurl不带“http”或“https”开头则判定为微信小程序跳转。</span>
   * 非必填
   */
  private String returnUrl;
  /**
   * 签名位置坐标列表
   */
  private SignaturePositions signaturePositions;
  /**
   * 版本号用于区分手动签的版本，
   * 枚举值： 2-v2版本, 3-v3版本
   * 默认为2
   * 非必填
   */
  private String version;
  /**
   * 签署完成推送地址
   * 此处有配置则签署推送消息优先使用此配置，
   * 如果此处没有配置，则取开发者统一配置的异步推送地址
   */
  private String pushUrl;
  /**
   * 是否要求必须全部阅读
   * 枚举值0/1，
   * 0-无需拖动到页面底部即可确认签署
   * 1-必须拖动到页面底部，表示阅读完毕才能确认签署
   * 默认为0
   * 非必填
   */
  private String readAll;
  /**
   * app调用SDK刷脸的消息通知
   *
   * app 调用SDK进行刷脸时用到的参数，
   * 参数内容为JSBridge，即手动签页面将此参数传递给客户app以便客户app调用对应的刷脸SDK，
   * 此时页面将离开手动签页面，后续开发者在SDK刷脸成功后需自行调用自动签接口完成签署，
   * 使用此方法本质是自动签。
   * 一般情况，如果不需要用户跳出手动签页面执行其他app操作的话，则REQUEST BODY不需要带有此参数。
   * 新版手动签在返回签署人配置的时候，会将此参数返回给前端，前端需要将此参数传递给app。
   * 非必填
   */
  private String app;
  /**
   * 签名图片宽度
   * 本次签署使用的签名/印章图片在合同PDF上显示的宽度，72dpi下的磅值。
   * 如果指定位置上没有设置签名图片的宽度和高度
   * 那么按照如下默认值处理：
   * 个人签名：默认高度：48磅，最大宽度：130磅，宽度一般小于等于130磅。
   * 企业印章：默认宽度：130磅，默认高度：130磅
   * <span style="color:red">
   * 注意：signatureImageWidth和signatureImageHeight必须同时为空，或者同时存在。
   * 同时为空则使用系统默认的高度和宽度
   * （宽度和高度最大130磅，小于130磅的使用原始尺寸，大于130磅的按比例缩放）。
   * 如果同时有值，则图片按照两个宽高值拉伸/压缩填充，效果可能会产生变形。
   * </span>
   * 非必填
   */
  private String signatureImageWidth;
  /**
   * 签名图片高度
   * 本次签署使用的签名/印章图片在合同PDF上显示的高度，72dpi下的磅值。
   * 如果指定位置上没有设置签名图片的宽度和高度，
   * 那么按照如下默认值处理：
   * 个人签名：默认高度：48磅，最大宽度：130磅，宽度一般小于等于130磅。
   * 企业印章：默认宽度：130磅，默认高度：130磅。
   * <span style="color:red">
   * 注意：signatureImageWidth和signatureImageHeight必须同时为空，或者同时存在。
   * 同时为空则使用系统默认的高度和宽度
   * （宽度和高度最大130磅，小于130磅的使用原始尺寸，大于130磅的按比例缩放）。
   * 如果同时有值，则图片按照两个宽高值拉伸/压缩填充，效果可能会产生变形。
   * </span>
   * 非必填
   */
  private String signatureImageHeight;
  /**
   * 是否显示手写时间
   * 枚举值0/1，
   * 1-手写面板及签名图片上显示手写签名操作的时间
   * 0-不显示该时间
   * 默认为0
   * 非必填
   */
  private String isShowHandwrittenTime;
  /**
   * 是否使用刷脸签（支持微信小程序、支付宝小程序内的刷脸签署校验）
   * 1-刷脸签，使用刷脸校验；
   * 0或其他-非刷脸签，使用短信校验或无校验；
   * 非必填
   */
  private String isFaceAuth;
  /**
   * 签署校验类型
   * 签署校验类型，表示此次签署使用什么方式进行校验，数组形式。
   * <br> 目前的校验方式有：
   * sms：短信验证码验证；
   * face：刷脸验证；
   * OTP：动态令牌验证（动态口令）。
   * 校验类型可指定唯一一个校验方式，如：verifyType = ["sms"]
   *  表示仅使用短信验证码验证，同理也可单独指定刷脸校验、或单独指定动态口令校验。
   * 校验类型包含多个校验方式时，由用户在手动签页面自己选择验证方式，如：
   * verifyType = ["sms","face","OTP"]
   * 表示用户可选择短信验证码验证或者刷脸验证、或者动态口令牌校验。
   * verifyType校验逻辑：
   * a. verifyType为空：优先使用isFaceAuth设置，
   * 如isFaceAuth未设置则校验vcodeMail和vcodeMobile（即标准流程）；
   * b. verifyType不为空：
   * b1.包含"sms"：校验vcodeMail和vcodeMobile，如果未填写，则接口返回错误码：240006
   * b2.包含"face"：无视isFaceAuth是否有值，或者值是多少，
   * 均可以刷脸签 B3. 包含"OTP"：才可选动态口令牌校验。
   */
  private String verifyType;

  @Override
  public String getMethodName() {
    return "/contract/send/";
  }

  @Override
  public Method getMethodType() {
    return Method.POST;
  }

  @Override
  public Class<ContractSendResponse> getResponseClass() {
    return ContractSendResponse.class;
  }

}
